今天,我們將深入了解提示(Prompt)和響應的機制,並學習如何使用ChatClient
提交基本提示,以及如何處理AI模型的響應。
在生成式AI中,**提示(Prompt)**是引導AI模型生成所需輸出的關鍵。提示可以是問題、指令或任何形式的文本,旨在告訴模型您希望它產生什麼樣的響應。
AI模型根據這些提示生成響應(Response)。這個過程可以視為一種對話,其中您提供輸入,模型給出回應。理解這種機制有助於我們更有效地與AI模型互動,從而獲得更準確或更有創造性的結果。
ChatClient
是Spring AI提供的一個流暢API,用於與AI模型通信。它支持同步和反應式兩種編程模型。我們可以使用ChatClient
構建並提交提示,然後接收模型的響應。
首先,我們需要創建一個ChatClient
實例。有兩種方式:
@RestController
class MyController {
private final ChatClient chatClient;
public MyController(ChatClient.Builder chatClientBuilder) {
this.chatClient = chatClientBuilder.build();
}
@GetMapping("/ai")
String generation(String userInput) {
return this.chatClient.prompt()
.user(userInput)
.call()
.content();
}
}
如果您需要使用多個聊天模型,可以禁用自動配置,並為每個ChatModel
程序化地創建一個ChatClient.Builder
實例:
ChatModel myChatModel = ... // 通常是通過@Autowired注入
ChatClient.Builder builder = ChatClient.builder(myChatModel);
// 或者使用默認設置創建ChatClient:
ChatClient chatClient = ChatClient.create(myChatModel);
以下是如何使用ChatClient
提交一個簡單的提示並獲取模型的響應:
String answer = chatClient.prompt()
.user("請告訴我一個笑話")
.call()
.content();
System.out.println("AI模型的回應:" + answer);
在這個示例中:
prompt()
:開始構建提示。user("請告訴我一個笑話")
:設置用戶消息,即我們的提示。call()
:提交提示給AI模型。content()
:獲取AI模型返回的文本內容。ChatClient
提供了多種方式來處理AI模型的響應:
如果您需要訪問更詳細的響應信息,例如元數據或多個生成結果,可以使用chatResponse()
方法:
ChatResponse chatResponse = chatClient.prompt()
.user("請告訴我一個笑話")
.call()
.chatResponse();
您可以將AI模型的輸出直接映射到一個Java實體類。例如:
record Joke(String setup, String punchline) {}
Joke joke = chatClient.prompt()
.user("請給我講一個笑話,並以JSON格式返回,包含'setup'和'punchline'字段。")
.call()
.entity(Joke.class);
System.out.println("笑話開頭:" + joke.setup());
System.out.println("笑話結尾:" + joke.punchline());
如果您希望以反應式方式處理模型的輸出,可以使用stream()
方法:
Flux<String> output = chatClient.prompt()
.user("請逐字逐句地告訴我一個笑話")
.stream()
.content();
output.subscribe(System.out::println);
您可以在ChatClient
的構建過程中設置默認的系統消息或其他選項,以簡化後續的提示提交。例如,設置默認的系統消息使模型以特定風格回應:
ChatClient chatClient = ChatClient.builder(chatModel)
.defaultSystem("你是一個會用海盜口吻講話的友好聊天機器人")
.build();
String response = chatClient.prompt()
.user("今天天氣怎麼樣?")
.call()
.content();
System.out.println(response);
模型可能會回應:
嗨,夥計!今天天氣晴朗,適合揚帆出海!